#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdint.h>
#include<sys/timerfd.h>


int main()
{
    // int timerfd_create(int clockid, int flags);//创建定时器对象,返回文件描述符
    int timerfd = timerfd_create(CLOCK_MONOTONIC, 0);//clockid: CLOCK_REALTIME-系统实时时间，如果修改了系统时间就会出问题；
    if(timerfd < 0)                                  //         CLOCK_MONOTONIC-从开机到现在的时间是⼀种相对时间；
    {                                                //flags: 0-默认阻塞属性
        perror("timerfd_create error");
        return -1;
    }                                             
    // int timerfd_settime(int fd, int flags, struct itimerspec *new, struct itimerspec *old);   //new： ⽤于设置定时器的新超时时间
    struct itimerspec itime;                                                                     //old： ⽤于接收原来的超时时间
    itime.it_value.tv_sec = 3;                               
    itime.it_value.tv_nsec = 0;//第一次超时时间为1s
    itime.it_interval.tv_sec = 3;
    itime.it_interval.tv_nsec = 0;//第一次超时后,每次超市间隔为1s              
    timerfd_settime(timerfd, 0, &itime, NULL);//启动定时器
    //*这个定时器描述符将每隔三秒都会触发⼀次可读事件*/

    while(1)
    {
        uint64_t times;//8字节
        /*需要注意的是定时器超时后,则描述符触发可读事件，必须读取8字节的数据，保存的是自上次启动定时器或read后的超时次数*/

        int ret = read(timerfd, &times, 8);
        if(ret < 0)
        {
            perror("read error");
            break;
        }
        printf("超时了，距离上一次超时了%ld次\n", times);
    }
    close(timerfd);
    return 0;
}